class Solution {
public:
    bool check[21][21];
    int m, n, step;
    int ret;
    int uniquePathsIII(vector<vector<int>>& grid) {
        m = grid.size(), n = grid[0].size();
        int bx, by;
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 0)step++;
                if (grid[i][j] == 1) {
                    bx = i;
                    by = j;
                }
            }
        }
        check[bx][by] = true;
        step += 2;
        dfs(grid, bx, by, 1);

        return ret;
    }
    int dx[4] = { 0 ,0 , 1 ,-1 };
    int dy[4] = { 1 ,-1 , 0 ,0 };

    void dfs(vector<vector<int>>& grid, int i, int j, int count)
    {
        if (grid[i][j] == 2)
        {
            if (count == step)
                ret++;
            return;
        }

        for (int k = 0; k < 4; k++)
        {
            int x = i + dx[k], y = j + dy[k];

            if (x >= 0 && x < m && y >= 0 && y < n && !check[x][y] && grid[x][y] != -1)
            {
                check[x][y] = true;

                dfs(grid, x, y, count + 1);

                check[x][y] = false;
            }
        }
    }
};